#ifndef SERIAL_OUTPUT_H
#define SERIAL_OUTPUT_H

#include <Arduino.h>
#include "config.h"

extern bool serial_enable_g;  // 声明外部变量
// 封装串口打印函数
inline void serial_print(const char* str) {
    Serial.print(str);
    // if (serial_enable_g) {
    //     Serial.print(str);
    // }
}

inline void serial_print(const int val) {
    Serial.print(val);
    // if (serial_enable_g) {
    //     Serial.print(val);
    // }
}

inline void serial_print(const String& str) {
    Serial.print(str);
    // if (serial_enable_g) {
    //     Serial.print(str);
    // }
}

// 使用模板支持任意维度的数组
template<typename T, size_t N>
inline void serial_print(const T (&arr)[N]) {
    if (serial_enable_g) {
        for(size_t i = 0; i < N; i++) {
            Serial.print(arr[i]);
            Serial.print(" ");
        }
    }
}

template<typename T, size_t N, size_t M>
inline void serial_print(const T (&arr)[N][M]) {
    if (serial_enable_g) {
        for(size_t i = 0; i < N; i++) {
            for(size_t j = 0; j < M; j++) {
                Serial.print(arr[i][j]);
                Serial.print(" ");
            }
            Serial.println();
        }
    }
}

inline void serial_println(const char* str) {
    Serial.println(str);
    if (serial_enable_g) {
        Serial.println(str);
    }
}

inline void serial_println(const int val) {
    Serial.println(val);
    // if (serial_enable_g) {
    //     Serial.println(val);
    // }
}

inline void serial_println(const String& str) {
    Serial.println(str);
    // if (serial_enable_g) {
    //     Serial.println(str);
    // }
}

// 使用模板支持任意维度的数组
template<typename T, size_t N>
inline void serial_println(const T (&arr)[N]) {
    for(size_t i = 0; i < N; i++) {
        Serial.print(arr[i]);
        Serial.print(" ");
    }
    Serial.println();
    if (serial_enable_g) {
        for(size_t i = 0; i < N; i++) {
            Serial.print(arr[i]);
            Serial.print(" ");
        }
        Serial.println();
    }
}

template<typename T, size_t N, size_t M>
inline void serial_println(const T (&arr)[N][M]) {
    if (serial_enable_g) {
        for(size_t i = 0; i < N; i++) {
            for(size_t j = 0; j < M; j++) {
                Serial.print(arr[i][j]);
                Serial.print(" ");
            }
            Serial.println();
        }
    }
}

inline void serial_printf(const char* format, ...) {
    if (serial_enable_g) {
        va_list args;
        va_start(args, format);
        char buf[256];
        vsnprintf(buf, sizeof(buf), format, args);
        Serial.print(buf);
        va_end(args);
    }
}

#endif // SERIAL_OUTPUT_H 
